package com.shop.controller;

import com.shop.common.Result;
import com.shop.dto.MemberDTO;
import com.shop.entity.Member;
import com.shop.service.MemberService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 会员管理控制器
 * 
 * 提供会员信息的增删改查功能，包括：
 * - 会员信息的创建、查询、更新和删除
 * - 根据手机号或会员卡号查询会员
 * - 支持会员信息的批量操作
 * 
 * @author Shop Management System
 * @version 1.0
 * @since 2024-01-01
 */
@RestController
@RequestMapping("/api/members")
@Slf4j
public class MemberController {

    @Autowired
    private MemberService memberService;

    /**
     * 获取所有会员信息
     * 
     * 返回系统中所有活跃会员的完整信息列表
     * 
     * @return Result<List<Member>> 会员信息列表
     * @apiNote 该接口会返回所有会员的基本信息，包括ID、姓名、手机号、会员卡号等
     */
    @GetMapping
    public Result<List<Member>> getAllMembers() {
        return Result.success(memberService.findAllMembers());
    }

    /**
     * 根据会员ID获取会员信息
     * 
     * 通过会员的唯一标识ID查询会员详细信息
     * 
     * @param id 会员ID，必填参数
     * @return Result<Member> 会员信息，如果不存在则data为null
     * @apiNote 如果指定的会员ID不存在，将返回404 Not Found状态码
     */
    @GetMapping("/{id}")
    public Result<Member> getMemberById(@PathVariable Long id) {
        Member member = memberService.findMemberById(id);
        return Result.success(member);
    }

    /**
     * 创建新会员
     * 
     * 创建新的会员账户，系统会自动生成会员卡号和创建时间
     * 
     * @param memberDTO 包含会员信息的DTO
     * @return Result<Member> 新增的会员信息
     * @apiNote 会员卡号由系统自动生成，确保唯一性
     */
    @PostMapping
    public Result<Member> createMember(@RequestBody MemberDTO memberDTO) {
        log.info("获取会员操作{}", memberDTO);
        Member member = new Member();
        member.setName(memberDTO.getName());
        member.setCardNumber(memberDTO.getCardNumber());
        member.setPhone(memberDTO.getPhone());
        memberService.addMember(member);
        return Result.success();
    }

    /**
     * 更新会员信息
     * 
     * 根据会员ID更新会员的基本信息，包括姓名、手机号、会员卡号和邮箱
     * 
     * @param id 会员ID，必填参数
     * @param memberDTO 更新的会员信息
     * @return Result<Member> 更新后的会员信息
     * @apiNote 只能更新会员的基本信息，不能修改系统自动生成的字段如创建时间
     */
    @PutMapping("/{id}")
    public Result<Member> updateMember(@PathVariable Long id, @RequestBody MemberDTO memberDTO) {
        Member existingMember = memberService.findMemberById(id);
        existingMember.setName(memberDTO.getName());
        existingMember.setCardNumber(memberDTO.getCardNumber());
        existingMember.setPhone(memberDTO.getPhone());
        existingMember.setPoints(memberDTO.getPoints());
        memberService.updateMember(existingMember);
        return Result.success(existingMember);
    }

    /**
     * 删除会员
     * 
     * 根据会员ID删除指定的会员账户
     * 
     * @param id 会员ID，必填参数
     * @return Result<Void>
     * @apiNote 删除操作不可恢复，请谨慎操作
     */
    @DeleteMapping("/{id}")
    public Result<Void> deleteMember(@PathVariable Long id) {
        log.info("被删除的id为{}", id);
        memberService.deleteMember(id);
        return Result.success();
    }
    
    /**
     * 根据手机号查询会员
     * 
     * 通过手机号码查找对应的会员信息
     * 
     * @param phoneNumber 手机号码，必填参数
     * @return Result<Member> 查询到的会员，如果不存在则data为null
     * @apiNote 手机号查询常用于会员快速识别和登录验证
     */
    @GetMapping("/phone/{phoneNumber}")
    public Result<Member> getMemberByPhoneNumber(@PathVariable String phoneNumber) {
        Member member = memberService.findMemberByPhoneNumber(phoneNumber);
        return Result.success(member);
    }

    /**
     * 根据会员卡号查询会员
     * 
     * 通过会员卡号查找对应的会员详细信息
     * 
     * @param cardNumber 会员卡号，必填参数
     * @return Result<Member> 会员信息，如果不存在则data为null
     * @apiNote 会员卡号查询常用于收银台快速识别会员身份
     */
    @GetMapping("/card/{cardNumber}")
    public Result<Member> getMemberByCardNumber(@PathVariable String cardNumber) {
        Member member = memberService.findMemberByCardNumber(cardNumber);
        return Result.success(member);
    }
} 